Skip to main content
Version: 1.5.0

什么是 Zero Copy?

问题描述

在文档和代码中经常看到 Zero Copy(零拷贝)的概念,它的具体内涵是什么?

解决方案

某些硬件单元对输入数据在内存中的格式有特定要求。例如,FFmpeg 依赖的 VPU(Video Processing Unit,视频处理单元)要求数据在内存中必须是连续紧密排列的,硬件只能通过物理地址递增的方式读取数据。

但在 Linux 系统中,应用程序通过 malloc 接口申请到的内存通常不满足硬件要求,具体表现为:

  1. malloc 返回的是 Linux 用户态虚拟地址,而芯片硬件需要的是物理地址
  2. malloc 返回的虚拟地址对应的内存页面在 DDR 中是不连续的,而硬件需要连续的物理页面

为了解决这些问题,传统的做法是:SDK 先申请一块连续的物理内存,然后将数据从源内存拷贝到这块连续物理内存上,再交给硬件处理。

而 Zero Copy(零拷贝)技术的意思是:如果输入数据已经位于连续的物理内存中,就可以避免这次不必要的数据拷贝。因此,SDK 通常会要求用户通过 zero_copy 参数来提供这个信息,SDK 根据此信息决定是否需要复制输入数据,从而在保证功能正确的同时实现最高的处理效率。

此外,接口的同步/异步特性也会影响 Zero Copy 的决策:

  • 异步接口:返回时不能保证数据处理已经开始或结束。考虑到应用程序可能随时回收缓存,异步接口可能会在内部执行一次数据拷贝
  • 同步接口:返回时保证数据处理已经完成,工作期间数据缓存是安全的,因此通常不需要额外拷贝